#ifndef	_SESSION_PKG_DATA_MANAGE_H_
#define	_SESSION_PKG_DATA_MANAGE_H_

#include <ext/hash_map>
#include <string>
#include "singleton.h"
#include "packet.h"
#include "nenginesession.h"
using namespace std;
using namespace __gnu_cxx;

//20141106对于session对应的包数据进行管理
//目前主要用于包留存
//1.多个会话的管理
//2.使用一个缓冲区
//3.能够用户自定义文件存放路径或者存放规则
//抓包后，按照原始的顺序存放到一个缓冲区中，
//一个网络设备一个缓冲区，然后是mmap的方式映
//射到文件，定时进行缓冲区更新和重新映射
//然后建立session会话管理的抽象机制将这些包
//进行分析并索引生成，也就是并不是建立实际的
//分包存储机制，只是为这个大缓冲区的数据编制索引。

//接口可以沿用，但是内部机制可以改，使用一个专用线
//程，然后是vector来进行索引啥的信息管理

//文件 日志 数据库 都应该采用类似muduo的日志设计，
//自开线程进行单独处理。
class SessionPkgDataManage
{
	friend class Singleton<SessionPkgDataManage>;
public:
	SessionPkgDataManage();
	~SessionPkgDataManage();
	//session包管理函数
	bool insertPkgToSession(SessionInfon *,packet_t *);//插入包到对应的session中
	bool deletePkgFromSession(SessionInfon *);//从会话中删除pkg缓冲区
	bool flushPkgToRawPcapFile(SessionInfon *);//刷新会话包数据到文件中
	//session缓冲区扩展管理函数
	bool resizeSessionBufSize(SessionInfon *,size_t buf_len);//对指定的会话进行空间调整
private:
	typedef struct {
		size_t _bufMaxLen;//缓冲最大长度
		size_t _bufCurUsedLen;//缓冲当前已使用长度
	} bufSizeInfo;
	//会话使用hashmap来进行存储
	//session的hash值为key，缓冲区指针为val
	hash_map<uint32_t,uint8_t *> _sessionBufMap;
	//缓冲区管理hashmap
	//缓冲区指针为key，缓冲区长度为val
	hash_map<uint8_t *,bufSizeInfo> _sessionBufInfoMap;
	//会话内部基本函数
	uint32_t getSessionHash(SessionInfon *);//计算sess的hash用来存取数据
	//缓冲区基本管理函数
	uint8_t *assignNewMemToBuf(size_t);//分配一个新缓冲区
	size_t getBufCurUsedSize(uint8_t *);//获取当前缓冲区使用的空间长度
	void freeBuf(uint8_t *);//释放缓冲区空间
	size_t getBufSize(uint8_t *);//获取指针对应缓冲区的长度
	size_t resizeBufSize(uint8_t **,size_t);//对缓冲区进行尺寸的重新设置
	void clearBuf(uint8_t *);//清空缓冲区全部置0
};

#endif
